public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.getSum(13, 15));

    }

    public int missingNumber1(int[] nums) {
        /**
         * 丢失的数字
         *  解法1：使用数组*/
        // 1 预处理
        int n = nums.length;
        int[] arr = new int[n+1];

        // 2 执行逻辑
        for(int e: nums) {
            arr[e] ++;
        }
        for(int i = 0; i <= n; i++) {
            if(arr[i] == 0) {
                return i;
            }
        }

        // 3 返回值
        return -1;
    }

    public int missingNumber2(int[] nums) {
        /**
         * 丢失的数字
         *  解法2：使用异或操作，先完整异或0-n，再异或缺失项数组，如此未被消除的最终结果一定是最终的缺失值*/
        // 1 初始化
        int n = nums.length;

        // 2 执行逻辑
        int ret = 0;
        for(int i = 1; i <= n; i++) {
            ret ^= i;
        }
        for(int e: nums) {
            ret ^= e;
        }

        // 3 返回值
        return ret;
    }

    public int missingNumber(int[] nums) {
        /**
         * 丢失的数字
         *  解法2：高斯求和*/
        // 1 初始化
        int n = nums.length;

        // 2 执行逻辑（高斯求和算出总和，再相减，最终值就是缺少值）
        int sum = (n * (n+1)) / 2;
        for(int e: nums) {
            sum -= e;
        }

        // 3 返回值
        return sum;
    }

    public int getSum(int a, int b) {
        /**
         * 两整数之和
         *  不使用运算符+-，去计算两整数之和
         *  思路：
         *      1，去计算二进制位相加-太扯淡了，这不还是相加吗
         *      2，计算二进制吧*/
        // 1 预处理
        // -默认无进位
        int prev = 0;
        int c = 0;

        // 2 执行逻辑（设置c）
        for(int i = 0; i < 32; i++) {
            int aBit = (a>>i) & 1;
            int bBit = (b>>i) & 1;
            if(prev == 1) {
                // -判断有进位
                if(aBit == bBit) {
                    c |= (1<<i);
                    if(aBit == 0) {
                        prev = 0;
                    }
                }
            } else {
                // -判断无进位
                if(aBit != bBit) {
                    c |= (1<<i);
                } else {
                    if(aBit == 1) {
                        prev = 1;
                    }
                }
            }
        }

        // 3 返回值
        return c;
    }
}
